home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir37 / ms_sh23s.zip / SRC / SH6.C < prev    next >
C/C++ Source or Header  |  1994-08-26  |  12KB  |  420 lines

  1. /*
  2.  * MS-DOS SHELL - Data Declarations
  3.  *
  4.  * MS-DOS SHELL - Copyright (c) 1990,4 Data Logic Limited and Charles Forsyth
  5.  *
  6.  * This code is based on (in part) the shell program written by Charles
  7.  * Forsyth and is subject to the following copyright restrictions:
  8.  *
  9.  * 1.  Redistribution and use in source and binary forms are permitted
  10.  *     provided that the above copyright notice is duplicated in the
  11.  *     source form and the copyright notice in file sh6.c is displayed
  12.  *     on entry to the program.
  13.  *
  14.  * 2.  The sources (or parts thereof) or objects generated from the sources
  15.  *     (or parts of sources) cannot be sold under any circumstances.
  16.  *
  17.  *    $Header: /usr/users/istewart/shell/sh2.3/Release/RCS/sh6.c,v 2.15 1994/08/25 20:49:11 istewart Exp $
  18.  *
  19.  *    $Log: sh6.c,v $
  20.  *    Revision 2.15  1994/08/25  20:49:11  istewart
  21.  *    MS Shell 2.3 Release
  22.  *
  23.  *    Revision 2.14  1994/02/23  09:23:38  istewart
  24.  *    Beta 233 updates
  25.  *
  26.  *    Revision 2.13  1994/02/01  10:25:20  istewart
  27.  *    Release 2.3 Beta 2, including first NT port
  28.  *
  29.  *    Revision 2.12  1994/01/11  17:55:25  istewart
  30.  *    Release 2.3 Beta 0 patches
  31.  *
  32.  *    Revision 2.11  1993/11/09  10:39:49  istewart
  33.  *    Beta 226 checking
  34.  *
  35.  *    Revision 2.10  1993/08/25  16:03:57  istewart
  36.  *    Beta 225 - see Notes file
  37.  *
  38.  *    Revision 2.9  1993/07/02  10:21:35  istewart
  39.  *    224 Beta fixes
  40.  *
  41.  *    Revision 2.8  1993/06/14  11:00:12  istewart
  42.  *    More changes for 223 beta
  43.  *
  44.  *    Revision 2.7  1993/06/02  09:52:35  istewart
  45.  *    Beta 223 Updates - see Notes file
  46.  *
  47.  *    Revision 2.6  1993/02/16  16:03:15  istewart
  48.  *    Beta 2.22 Release
  49.  *
  50.  *    Revision 2.5  1993/01/26  18:35:09  istewart
  51.  *    Release 2.2 beta 0
  52.  *
  53.  *    Revision 2.4  1992/12/14  10:54:56  istewart
  54.  *    BETA 215 Fixes and 2.1 Release
  55.  *
  56.  *    Revision 2.3  1992/11/06  10:03:44  istewart
  57.  *    214 Beta test updates
  58.  *
  59.  *    Revision 2.2  1992/09/03  18:54:45  istewart
  60.  *    Beta 213 Updates
  61.  *
  62.  *    Revision 2.1  1992/07/10  10:52:48  istewart
  63.  *    211 Beta updates
  64.  *
  65.  *    Revision 2.0  1992/04/13  17:39:09  Ian_Stewartson
  66.  *    MS-Shell 2.0 Baseline release
  67.  *
  68.  *
  69.  */
  70.  
  71. #include <sys/types.h>
  72. #include <sys/stat.h>
  73. #include <stddef.h>
  74. #include <stdio.h>
  75. #include <setjmp.h>
  76. #include <stdlib.h>
  77. #include <limits.h>
  78. #include <unistd.h>
  79. #include "sh.h"
  80.  
  81. #if (OS_TYPE == OS_UNIX)
  82. #  include <sys/utsname.h>
  83. static char    *Copy_Right1 = "%s %s SH Version 2.3 (%s) - %s (OS %s.%s)\n";
  84. #else
  85. static char    *Copy_Right1 = "%s %s SH Version 2.3 (%s) - %s (OS %d.%d)\n";
  86. #endif
  87.  
  88.  
  89. #if (OS_TYPE == OS_OS2)
  90. char        *LIT_OSname = "OS2";
  91. #  if (OS_SIZE == OS_32)
  92. static char    *Copy_Right2 = "(32-Bit)";
  93. #  else
  94. static char    *Copy_Right2 = "(16-Bit)";
  95. #  endif
  96. #elif (OS_TYPE == OS_DOS)
  97. char        *LIT_OSname = "MS-DOS";
  98. #  if (OS_SIZE == OS_32)
  99. static char    *Copy_Right2 = "(32-Bit)";
  100. #  else
  101. static char    *Copy_Right2 = "(16-Bit)";
  102. #  endif
  103. #elif (OS_TYPE == OS_NT)
  104. char        *LIT_OSname = "MS-WNT";
  105. static char    *Copy_Right2 = "";
  106. #elif (OS_TYPE == OS_UNIX)
  107. char        *LIT_OSname = "UNIX";
  108. #endif
  109.  
  110. static char    *Copy_Right3 = "Copyright (c) Data Logic Ltd and Charles Forsyth 1990, 94\n";
  111.  
  112. #if (OS_TYPE == OS_DOS) && (OS_SIZE == OS_32)
  113. bool        IgnoreHardErrors = FALSE;/* Hard Error Flag        */
  114. #endif
  115.  
  116. int        BaseOS;            /* Underlying OS        */
  117. char        **ParameterArray = (char **)NULL; /* Parameter array    */
  118. int        ParameterCount = 0;    /* # entries in parameter array    */
  119. int        ExitStatus;        /* Exit status            */
  120. bool        ExpansionErrorDetected;
  121.                 /* interactive (talking-type wireless)    */
  122. bool        InteractiveFlag = FALSE;
  123. bool        ProcessingEXECCommand;    /* Exec mode            */
  124. bool        UseConsoleBuffer = FALSE;/* Flag from dofc to        */
  125.                     /* GetConsoleInput        */
  126. int        AllowMultipleLines;    /* Allow continuation onto    */
  127.                     /* Next line            */
  128. int        Current_Event = 0;    /* Current history event    */
  129. bool        ChangeInitLoad = FALSE;    /* Change load .ini pt.        */
  130. unsigned int    ShellGlobalFlags = 0;    /* Other global flags        */
  131. int        MaxNumberofFDs = 20;    /* Max no of file descriptors    */
  132.  
  133. int        DisabledVariables = 0;    /* Disabled variables        */
  134. int        StartCursorPosition = -1;/* Start cursor position    */
  135.  
  136. #ifndef OS_SWAPPING
  137. unsigned int    SW_intr;        /* Interrupt flag        */
  138. bool        IgnoreInterrupts = FALSE;/* Ignore interrupts flag    */
  139. #else
  140.                     /* Swap mode            */
  141. int        Swap_Mode = SWAP_EXPAND | SWAP_DISK;
  142. #endif
  143.  
  144. Break_C        *Break_List;    /* Break list for FOR/WHILE        */
  145. Break_C        *Return_List;    /* Return list for RETURN        */
  146. Break_C        *SShell_List;    /* SubShell list for EXIT        */
  147. bool        RestrictedShellFlag = FALSE;    /* Restricted shell    */
  148.                 /* History processing enabled flag    */
  149. bool        HistoryEnabled = FALSE;
  150.  
  151. void        *FunctionTree = (void *)NULL;    /* Function tree    */
  152. FunctionList    *CurrentFunction = (FunctionList *)NULL;
  153. void        *AliasTree = (void *)NULL;    /* Alias tree        */
  154.  
  155. #if (OS_TYPE != OS_DOS)
  156. void        *JobTree = (void *)NULL;    /* job tree        */
  157. bool        ExitWithJobsActive = FALSE;    /* Exit flag        */
  158. int        CurrentJob = 0;            /* No current        */
  159. int        PreviousJob = 0;        /* Previous Job        */
  160. #endif
  161.  
  162. #if (OS_TYPE == OS_OS2)
  163. /*
  164.  * Session Info
  165.  */
  166. char        *SessionEndQName = (char *)NULL;    /* Queue    */
  167.  
  168. /*
  169.  * Special flag for EMX parameters
  170.  */
  171.  
  172. bool        EMXStyleParameters = FALSE;
  173. #endif
  174.  
  175. /*
  176.  * redirection
  177.  */
  178.  
  179. Save_IO        *SSave_IO;    /* Save IO array            */
  180. int        NSave_IO_E = 0;    /* Number of entries in Save IO array    */
  181. int        MSave_IO_E = 0;    /* Max Number of entries in SSave_IO    */
  182. S_SubShell    *SubShells;    /* Save Vars array            */
  183. int        NSubShells = 0;    /* Number of entries in SubShells    */
  184. int        MSubShells = 0;    /* Max Number of entries in SubShells    */
  185. int        LastNumberBase = -1;    /* Last base entered        */
  186.  
  187. int        InterruptTrapPending;    /* Trap pending            */
  188. int        Execute_stack_depth;    /* execute function recursion    */
  189.                     /* depth            */
  190. void        *VariableTree = (void *)NULL;    /* Variable dictionary    */
  191. VariableList    *CurrentDirectory;    /* Current directory        */
  192. char        *LastUserPrompt;    /* Last prompt output        */
  193. char        *LastUserPrompt1;    /* Alternate Last prompt output    */
  194. char        IFS[] = "IFS";        /* Inter-field separator    */
  195. char        PS1[] = "PS1";        /* Prompt 1            */
  196. char        PS2[] = "PS2";        /* Prompt 2            */
  197. char        PS3[] = "PS3";        /* Prompt 3            */
  198. char        PS4[] = "PS4";        /* Prompt 4            */
  199. char        PathLiteral[] = "PATH";
  200. char        CDPathLiteral[] = "CDPATH";
  201. char        CurrentDirLiteral[] = ".";
  202. char        ParentDirLiteral[] = "..";
  203. char        PathExtsLiteral[] = "PATHEXTS";
  204. char        HomeVariableName[] = "HOME";
  205. char        ShellVariableName[] = "SHELL";
  206. char        HistoryFileVariable[] = "HISTFILE";
  207. char        HistorySizeVariable[] = "HISTSIZE";
  208. char        *ComspecVariable= "COMSPEC";
  209. char        *ParameterCountVariable = "#";
  210. char        *ShellOptionsVariable = "-";
  211. char        StatusVariable[] = "?";
  212. char        SecondsVariable[] = "SECONDS";
  213. char        RandomVariable[] = "RANDOM";
  214. char        LineCountVariable[] = "LINENO";
  215. char        *RootDirectory = "x:/";
  216.  
  217. #if (OS_TYPE != OS_DOS)
  218. char        WinTitleVariable[] = "WINTITLE";
  219. #endif
  220.  
  221. char        *OldPWDVariable = "OLDPWD";
  222. char        *PWDVariable = "PWD";
  223. char        *ENVVariable = "ENV";
  224.  
  225. #if (OS_TYPE != OS_DOS)
  226. char        BATExtension[] = ".cmd";
  227. #else
  228. char        BATExtension[] = ".bat";
  229. #endif
  230.  
  231. char        SHELLExtension[] = ".sh";
  232. char        KSHELLExtension[] = ".ksh";
  233. char        EXEExtension[] = ".exe";
  234. char        COMExtension[] = ".com";
  235. char        *NotFound = "not found";
  236. char        *BasicErrorMessage = "%s: %s";
  237. char        *DirectorySeparator = "/";
  238. char        LastWordVariable[] = "_";
  239. char        OptArgVariable[] = "OPTARG";
  240. char        OptIndVariable[] = "OPTIND";
  241. char        MailCheckVariable[] = "MAILCHECK";
  242. char        FCEditVariable[] = "FCEDIT";
  243. char        EditorVariable[] = "EDITOR";
  244. char        VisualVariable[] = "VISUAL";
  245. char        Trap_DEBUG[] = "~DEBUG";
  246. char        Trap_ERR[] = "~ERR";
  247. char        LIT_dos[] = "DOS";
  248. char        *LIT_NewLine = "\n";
  249. char        *LIT_BadID = "bad identifier";
  250. char        LIT_export[] = "export";
  251. char        LIT_exit[] = "exit";
  252. char        LIT_exec[] = "exec";
  253. char        LIT_done[] = "done";
  254. char        LIT_history[] = "history";
  255. char        LIT_REPLY[] = "REPLY";
  256. char        LIT_LINES[] = "LINES";
  257. char        LIT_COLUMNS[] = "COLUMNS";
  258. char        *ListVarFormat = "%s=%s\n";
  259. char        *Outofmemory1 = "Out of memory";
  260. char        *LIT_Emsg = "%s: %s (%s)";
  261. char        *LIT_2Strings = "%s %s";
  262. char        *LIT_3Strings = "%s %s%s";
  263. char        *LIT_SyntaxError = "Syntax error";
  264. char         *LIT_BadArray = "%s: bad array value";
  265. char         *LIT_ArrayRange = "%s: subscript out of range";
  266. char        *LIT_BNumber = "[%d]";
  267. char        *LIT_Invalidfunction = "Invalid function name";
  268. char        *LIT_AllowTTY = "SH_ALLOWTTYPIPES";
  269. char        *LIT_IsReadonly = "is read-only";
  270. char        LIT_Test[] = "[[";
  271. int        MaximumColumns = 80;    /* Max columns            */
  272. int        MaximumLines = 25;    /* Max Lines            */
  273.  
  274. /*
  275.  * Fopen modes, different between IBM OS/2 2.x and the rest
  276.  */
  277.  
  278. #ifdef __IBMC__
  279. char        *sOpenReadMode = "r";    /* Open file in read mode    */
  280. char        *sOpenWriteMode = "w";    /* Open file in write mode    */
  281. char        *sOpenAppendMode = "w+";/* Open file in append mode    */
  282. char        *sOpenWriteBinaryMode = "wb";/* Open file in append mode    */
  283. #else
  284. char        *sOpenReadMode = "rt";    /* Open file in read mode    */
  285. char        *sOpenWriteMode = "wt";    /* Open file in write mode    */
  286. char        *sOpenAppendMode = "wt+";/* Open file in append mode    */
  287. char        *sOpenWriteBinaryMode = "wb";/* Open file in append mode    */
  288. #endif
  289.  
  290. #if (OS_TYPE == OS_OS2)
  291. STARTDATA    *SessionControlBlock;    /* Start a session info        */
  292.  
  293. STARTDATA    PM_SessionControlBlock = {    /* PM session defaults    */
  294.     sizeof (STARTDATA),            /* Length        */
  295.     SSF_RELATED_CHILD,            /* Related        */
  296.     SSF_FGBG_FORE,            /* FgBg            */
  297.     SSF_TRACEOPT_NONE,            /* TraceOpt        */
  298.     (char *)NULL,            /* PgmTitle        */
  299.     (char *)NULL,            /* PgmName        */
  300.     (PBYTE)NULL,            /* PgmInputs        */
  301.     (PBYTE)NULL,            /* TermQ        */
  302.     (char *)1,                /* Environment        */
  303.     SSF_INHERTOPT_PARENT,        /* InheritOpt        */
  304.     SSF_TYPE_PM,            /* SessionType        */
  305.     (char *)NULL,            /* IconFile        */
  306.     0L,                    /* PgmHandle        */
  307.     SSF_CONTROL_NOAUTOCLOSE,        /* PgmControl        */
  308.     0,                    /* InitXPos        */
  309.     0,                    /* InitYPos        */
  310.     100,                /* InitXSize        */
  311.     100                    /* InitYSize        */
  312. };
  313.  
  314. STARTDATA    DOS_SessionControlBlock = {    /* DOS session defaults    */
  315.     sizeof (STARTDATA),            /* Length        */
  316.     SSF_RELATED_CHILD,            /* Related        */
  317.     SSF_FGBG_FORE,            /* FgBg            */
  318.     SSF_TRACEOPT_NONE,            /* TraceOpt        */
  319.     (char *)NULL,            /* PgmTitle        */
  320.     (char *)NULL,            /* PgmName        */
  321.     (PBYTE)NULL,            /* PgmInputs        */
  322.     (PBYTE)NULL,            /* TermQ        */
  323.     (char *)1,                /* Environment        */
  324.     SSF_INHERTOPT_PARENT,        /* InheritOpt        */
  325.     SSF_TYPE_VDM,            /* SessionType        */
  326.     (char *)NULL,            /* IconFile        */
  327.     0L,                    /* PgmHandle        */
  328.     SSF_CONTROL_NOAUTOCLOSE,        /* PgmControl        */
  329.     0,                    /* InitXPos        */
  330.     0,                    /* InitYPos        */
  331.     100,                /* InitXSize        */
  332.     100                    /* InitYSize        */
  333. };
  334. #endif
  335.  
  336. /*
  337.  * Parser information
  338.  */
  339.  
  340. char            CurrentLexIdentifier [IDENT+1];/* Identifier    */
  341. Source            *source;    /* yyparse/ScanNextToken source    */
  342. YYSTYPE            yylval;        /* result from ScanNextToken    */
  343. int            yynerrs;    /* Parse error flag        */
  344.  
  345.  
  346. /*
  347.  * Global program mode information
  348.  */
  349.  
  350. ExeMode     ExecProcessingMode;    /* Global Program mode        */
  351.  
  352. /*
  353.  * Character Types array
  354.  */
  355.  
  356. unsigned char    CharTypes [UCHAR_MAX + 1];
  357.  
  358. /*
  359.  * Modified getopt values
  360.  */
  361.  
  362. int        OptionIndex = 1;    /* optind            */
  363. int        OptionStart;        /* start character        */
  364. char        *OptionArgument;    /* optarg            */
  365.  
  366. /*
  367.  * Device directory.  The length of this string is defined by the variable
  368.  * LEN_DEVICE_NAME_HEADER
  369.  */
  370.  
  371. char        *DeviceNameHeader = "/dev/";
  372.  
  373. int        MemoryAreaLevel;/* Current allocation area        */
  374. long        flags = 0L;    /* Command line flags            */
  375. char        null[] = "";    /* Null value                */
  376. char        ConsoleLineBuffer[LINE_MAX + 1]; /* Console line buffer    */
  377.  
  378. /*
  379.  * Current environment
  380.  */
  381.  
  382. ShellFileEnvironment    e = {
  383.     (int *)NULL,        /* Error handler            */
  384.     0L,                /* IO Map for this level        */
  385.     (char *)NULL,        /* Current line buffer            */
  386.     (ShellFileEnvironment *)NULL,    /* Previous Env pointer        */
  387. };
  388.  
  389. /*
  390.  * Some defines to print version and release info
  391.  */
  392.  
  393. #define str(s)        # s
  394. #define xstr(s)        str(s)
  395.  
  396. /*
  397.  * The only bit of code in this module prints the version number
  398.  */
  399.  
  400. void    PrintVersionNumber (FILE *fp)
  401. {
  402. #if (OS_TYPE == OS_UNIX)
  403.     char        *Copy_Right2 = null;
  404.     char        *_osmajor = null;
  405.     char        *_osminor = null;
  406.     struct utsname    name;
  407.  
  408.     if (!uname (&name))
  409.     {
  410.     Copy_Right2 = name.machine;
  411.     _osmajor = name.release;
  412.     _osminor = name.version;
  413.     }
  414.  
  415. #endif
  416.     fprintf (fp, Copy_Right1, LIT_OSname, Copy_Right2, xstr (RELEASE),
  417.          __DATE__, OS_VERS_N, _osminor);
  418.     fputs (Copy_Right3, fp);
  419. }
  420.